/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pe.edu.upc.dew.cobranzas.controller;

import java.text.SimpleDateFormat;
import java.util.Date;
import org.springframework.web.servlet.mvc.Controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.swing.JOptionPane;
import org.springframework.web.servlet.ModelAndView;
import pe.edu.upc.dew.cobranzas.model.Contrato;
import pe.edu.upc.dew.cobranzas.model.Inquilino;
import pe.edu.upc.dew.cobranzas.model.Propiedad;
import pe.edu.upc.dew.cobranzas.service.ContratoServiceImpl;
import pe.edu.upc.dew.cobranzas.service.CuotaServiceImpl;
import pe.edu.upc.dew.cobranzas.service.InquilinoServiceImpl;
import pe.edu.upc.dew.cobranzas.service.PropiedadServiceImpl;

public class ContratoController implements Controller {

    private ContratoServiceImpl contratoService;
    private InquilinoServiceImpl inquilinoService;
    private PropiedadServiceImpl propiedadService;
    private CuotaServiceImpl cuotaService;
    private String inicio;

    public void setInicio(String inicio) {
        this.inicio = inicio;
    }

    public void setContratoService(ContratoServiceImpl contratoService) {
        this.contratoService = contratoService;
    }

    public void setInquilinoService(InquilinoServiceImpl inquilinoService) {
        this.inquilinoService = inquilinoService;
    }

    public void setPropiedadService(PropiedadServiceImpl propiedadService) {
        this.propiedadService = propiedadService;
    }

    public void setCuotaService(CuotaServiceImpl cuotaService) {
        this.cuotaService = cuotaService;
    }

    public ModelAndView handleRequest(HttpServletRequest req, HttpServletResponse resp) throws Exception {


        req.setAttribute("inquilinos", inquilinoService.Listado());
        req.setAttribute("propiedades", propiedadService.Listado());
        if (inicio.equals("I")) {
            inicio = "R";
        } else {
            String boton = req.getParameter("boton");
            if (boton.equals("Registrar")) {
                if ((!req.getParameter("txtidContrato").equals("")) && (!req.getParameter("txtmonto").equals("")) && (!req.getParameter("txtmora").equals("")) && (!req.getParameter("txtfechaContrato").equals("")) && (!req.getParameter("txtfechaVencimiento").equals(""))) {
                    String fechaContrato = req.getParameter("txtfechaContrato");
                    String fechaVencimiento = req.getParameter("txtfechaVencimiento");

                    //validando fechas
                    SimpleDateFormat fecha = new SimpleDateFormat("dd/MM/yyyy");
                    Date dateIni = fecha.parse(fechaContrato);
                    Date dateFin = fecha.parse(fechaVencimiento);

                    if (dateIni.before(dateFin)) {
                        //Obteniendo valores
                        int idContrato = Integer.parseInt(req.getParameter("txtidContrato"));
                        String dniInquilino = req.getParameter("cmbinquilino");
                        Integer idPropiedad = Integer.parseInt(req.getParameter("cmbpropiedad"));
                        Double monto = Double.parseDouble(req.getParameter("txtmonto"));
                        String moneda = req.getParameter("cmbmoneda");
                        Double moraDiaria = Double.parseDouble(req.getParameter("txtmora"));
                        //Inquilino
                        Inquilino inquilino = new Inquilino();
                        inquilino = inquilinoService.getInquilinoPorDni(dniInquilino);
                        //propiedad
                        Propiedad propiedad = new Propiedad();
                        propiedad = propiedadService.getPropiedadPorId(idPropiedad);
                        //GUARDANDO CONTRATO
                        contratoService.Registra(idContrato, inquilino, propiedad, fechaContrato, fechaVencimiento, monto, moneda, moraDiaria);

                        //REGISTRANDO CRONOGRAMA DE CUOTAS
                        //===================================================================
                        Contrato contrato = new Contrato();
                        contrato = contratoService.getContratoPorCodigo(idContrato);

                        long diff = dateFin.getTime() - dateIni.getTime();
                        long meses = (int) (diff / (1000 * 60 * 60 * 24)) / 30; //SE OBTIENE EL NUMERO DE MESES DEL CONTRATO
                        int dayCuota = dateIni.getDate();
                        int monthCuota = dateIni.getMonth() + 1;
                        int yearCuota = dateIni.getYear() + 1900;
                        String dateCuota = null;
                        for (int i = 1; i <= meses; i++) {
                            monthCuota = monthCuota + 1;
                            if (monthCuota == 13) {
                                monthCuota = 1;
                                yearCuota = yearCuota + 1;
                            }
                            if ((dayCuota >= 29) && (monthCuota == 2)) {
                                if ((yearCuota % 4 == 0) && ((yearCuota % 100 != 0) || (yearCuota % 400 == 0))) {
                                    dayCuota = 29;
                                } else {
                                    dayCuota = 28;
                                }
                            } else {
                                dayCuota = dateIni.getDate();
                            }
                            dateCuota = String.valueOf(dayCuota) + '/' + String.valueOf(monthCuota) + '/' + String.valueOf(yearCuota);
                            //GUARDANDO LAS CUOTAS
                            cuotaService.Registra(i, dateCuota, "Pendiente", idContrato);
                        }
                    } else {
                        JOptionPane.showMessageDialog(null, "La fecha de vencimiento debe ser mayor a la fecha de contrato", "Error", JOptionPane.ERROR_MESSAGE);

                    }
                } else {
                    JOptionPane.showMessageDialog(null, "Debe ingresar todos los datos", "Error", JOptionPane.ERROR_MESSAGE);
                }
            } else {

                if (req.getParameter("contratoSeleccionado").isEmpty()) {
                    JOptionPane.showMessageDialog(null, "Debe seleccionar un contraro", "Error", JOptionPane.ERROR_MESSAGE);
                } else {
                    int idContrato = Integer.parseInt(req.getParameter("contratoSeleccionado"));
                    Contrato contrato = new Contrato();
                    contrato = contratoService.getContratoPorCodigo(idContrato);
                    cuotaService.Elimina(contrato);
                    contratoService.Elimina(contrato);
                }
            }
        }
        req.setAttribute("contratos", contratoService.Listado());
        req.setAttribute("idNuevo", contratoService.getNuevoCodido());
        return new ModelAndView("contratos");


    }
}
